(function () {
  /**
   * 以abstract修饰的类叫做抽象类，抽象类不能实例化
   * 抽象类是专门用来被继承的类
   * 抽象类中可以定义抽象方法，抽象方法没有具体实现
   */
  abstract class Animal {
    name: string;
    constructor(theName: string) {
      this.name = theName;
    }
    // 定义一个抽象方法
    // 抽象方法使用abstract开头，没有方法体
    // 抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写
    abstract sayHello(): void;
  }

  class Dog extends Animal {
    sayHello(): void {
      console.log("汪汪汪");
    }
  }
  const dog = new Dog("旺财");
  dog.sayHello();
})();
